package com.example.task.service.impl;

import com.example.task.service.TaskService;
import com.example.task.service.TestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class TaskServiceImpl implements TaskService {

    @Autowired
    private TestService testService;
    
    /**
     * @Async 可以加在实际实现类的重写方法上,也可以加在接口上
     */
    @Async
    @Override
    public void task1() {
        log.info("===================开始任务1====================");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("===================结束任务1====================");
    }
    
    @Override
    public void task2() {
        log.info("===================开始任务2====================");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("===================结束任务2====================");
    }

    /**
     * @Async 
     * 1.不能用在private修饰的方法上
     * 2.此时修饰的方法不能和调用它的方法在同一个类里
     */
    @Override
    public void task3() {
        log.info("===================开始任务3====================");
        this.task3Inner();
        log.info("===================结束任务3====================");
    }

    @Async
    public void task3Inner(){
        log.info("===================开始任务3内部方法====================");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("===================结束任务3内部方法====================");
    }

    @Override
    public void task4() {
        log.info("===================开始任务4====================");
        try {
            Thread.sleep(3000);
            log.info("===================开始任务4中的test1====================");
            testService.test1();
            log.info("===================结束任务4中的test1====================");
            Thread.sleep(7000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("===================结束任务4====================");
    }

    @Override
    public void test5() {
        log.info("执行异步线程 begin");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("执行异步线程 end");
    }
}
